#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

// int main()
// {

  //环境变量：是系统提供的一组name=value形式的变量。不同的环境变量有不同的用户，且环境变量通常具有全局属性
  //我们所运行的进程都是子进程，bash本身在启动的时候，会从操作系统的配置文件中读取环境变量信息，子进程会继承父进程交给我的环境变量
  //env指令，查看当前的环境变量

  //常见环境变量：
  //PATH（指令搜索路径）：能不能在任何目录下执行某个指令与它有很大的关系，它里面记录的是一些路径，若是没有在这些路径下找到这个指令，这屏幕显示command not
  //find”-----
  //echo $PATH 查看里面的内容；PATH=修改后的路径-->大多数指令跑不了，别这样搞；export PATH=$PATH:路径-->添加了某个路径；当终端重新启动后，PATH会自动恢复
  

  //eg：
  //Linux下一切东西皆是文件,我们执行自己的可执行程序,为什么要带./来运行呢? (本质是运行当前目录(.)下的可执行程序)
  //要执行一个可执行程序必须要先找到它在哪里,既然不带./就可以执行系统命令,说明系统能够通过命令的名称找到指令的位置,而系统是无法找到我们自己的可执行程序的, 带./是为了找到对应的程序,告诉系统该可执行程序位于当前目录下,当然我们也可也使用绝对路径和其它相对路径来运行程序

  //1.当我们自己写的代码经过编译连接后，生成可执行程序，通常用./mycode来执行，但是当我们向PATH路径中添加mycode所在路径后，可直接mycode运行,或者使用绝对路径去找它/home/dnx_66/linux/learn230902/mycode 


  //增加一个环境变量
  //命令行中：export my_env=666666
  //删除一个环境变量：
  // unset my_env
  //用函数获取环境变量
 //  char * val=getenv("my_env");
 //  printf("%s\n",val);
  
  //若只在命令行中写 my_env=666666 ，它其实没有添加到env中，因为这是一个本地变量
  //set指令可以查所有变量（环境，本地）
  //本地变量只会在bash内有效，不能被继承，只在本次登录时有效
  // 创建一个本地变量，用echo打印，为什么可以打印出来，不是说不能被继承吗，其实是命令分为：常规命令（通过创建子进程完成）和内建命令(由bash亲自执行)
 //  return 0;
// }


//环境变量的组织方式
//main 实际上是有参数的
// main(int argc,char* argv[],char* env[])
int main(int argc,char* argv[],char* env[])
{
  // argc：限定命令行字符串个数, 限定只能传多少个参数
  // argv : 指向一个个的命令行参数
  // env: 指向一个个环境变量,是一个环境表，存放环境变量字符串，是一个字符指针数组，最后一个是NULL 
  

  //获取环境变量
  // 法一：
  int i=0;
 //  for(;env[i];i++)
 //  {
  //   printf("argv[%d]-->%s\n",i,env[i]);
//  argv[0]-->XDG_SESSION_ID=210610
// argv[1]-->HOSTNAME=VM-0-8-centos
// argv[2]-->SHELL=/bin/bash
// argv[3]-->TERM=xterm
// argv[4]-->HISTSIZE=3000
// argv[5]-->USER=dnx_66
// ......
 //  }
    //法二：通过第三方变量environ获取环境变量
    extern char** environ;
    i=0;
    for(;environ[i];i++)
    {
      printf("argv[%d]-->%s\n",i,environ[i]);
    }
    //法三：通过函数getenv来获取环境变量 
//获取命令行参数（命令行可以看作以空格划分的字符串）
   printf("----------------------------------------------------------------------\n");
    i=0;
    for(;argv[i];i++)
    {
      printf("argv[%d]-->%s\n",i,argv[i]);
    }
    //命名行中如何：./mycode -a -b   ----->如同ls指令后面可以跟其他选项， ls -l / ls -al ，来实现不同的功能
    //argv[0]-->./mycode
    // argv[1]-->-a
    //argv[2]-->-b
  
  return 0;

}
